/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package familytree.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Antonio
 */
public class Tree implements ITree {

    private INode<String> raiz;
    private int nElementos;
    public static final String NOENCONTRADO = "no encontrado";

    public boolean addChildren(INode padre, INode hijo) {
        if (!exists(hijo.getIdentificador())) {
            padre.addChildren(hijo);
            nElementos++;
            return true;
        }
        return false;

    }

    public void addChildrens(INode padre, List<INode> hijos) {

        for (INode iNode : hijos) {
            if (!exists(iNode.getIdentificador())) {
                padre.addChildren(iNode);
                nElementos++;
            }
        }
    }

    public String findNode(Object identificador) {

        String s = "";
        if (raiz != null) {
            INode aux = raiz;
            s = findNode(identificador, aux, 0, NOENCONTRADO);
        } else {
            s = NOENCONTRADO;
        }


        return s;
    }

    public boolean isEmpty() {
        return raiz.getChildrens().isEmpty();
    }

    public boolean exists(Object identificador) {

        INode aux = raiz;
        return exists(identificador, aux);
    }

    public boolean exists(Object identificador, INode raiz) {

        boolean encontrado = false;

        if (!encontrado) {
            if (identificador instanceof String) {
                String s = (String) identificador;
                encontrado = s.equals((String) raiz.getIdentificador());
            }
        }

        Iterator<INode> it = raiz.getChildrens().iterator();
        while (it.hasNext() && !encontrado) {
            encontrado = encontrado || exists(identificador, it.next());
        }

        return encontrado;

    }

    private String findNode(Object identificador, INode aux, int indice,
            String ruta) {
        String s;

        s = ruta + "-" + Integer.toString(indice);
        int i = 0;
        if (s.contains(NOENCONTRADO)) {
            if (identificador instanceof String) {
                String cad = (String) identificador;
                if (cad.equals((String) aux.getIdentificador())) {
                    s = s.substring(NOENCONTRADO.length() + 1);
                }
            }
        }
        Iterator<INode> it = aux.getChildrens().iterator();
        String cad = s;
        while (it.hasNext() && s.contains(NOENCONTRADO)) {
            s = findNode(identificador, it.next(), i, cad);
            i++;
        }

        return s;
    }

    public boolean addChildren(INode padre, Object identificador, String valor) {
        INode nodo = new Node((String) identificador, valor);
        return addChildren(padre, nodo);
    }

    public void setRoot(Object identificador, String valor) {
        INode<String> nodo = new Node(identificador, valor);
        raiz = nodo;
    }

    public INode<String> getRoot() {
        return raiz;
    }

    public String[][] getValores(String[] ruta) {
        String[][] nodos = new String[2][0];
        List<String> listaNodos = new ArrayList<String>();
        List<String> listaId = new ArrayList<String>();
        INode nodo = raiz;
        listaNodos.add(raiz.getValor());
        listaId.add((String)raiz.getIdentificador());
        for (int i = 1; i < ruta.length; i++) {
            int pos = Integer.parseInt(ruta[i]);
            nodo = nodo.getChildren(pos);
            listaNodos.add(nodo.getValor());
            listaId.add((String)nodo.getIdentificador());
        }
        String[] nodos1 = new String[0];
        nodos1 = listaNodos.toArray(nodos1);
        String[] nodos2 = new String[0];
        nodos2 = listaId.toArray(nodos2);
        nodos[0] = nodos1;
        nodos[1] = nodos2;
        return nodos;
    }

    public INode[] getNodos(String[] ruta) {
        INode[] nodos = new INode[0];
        List<INode> listaNodos = new ArrayList<INode>();
        INode nodo = raiz;
        listaNodos.add(nodo);
        for (int i = 1; i < ruta.length; i++) {
            int pos = Integer.parseInt(ruta[i]);
            nodo = nodo.getChildren(pos);
            listaNodos.add(nodo);
        }
        return listaNodos.toArray(nodos);
    }
}
